/**
 * @(#)RetentLogServiceImpl.java 2017年11月27日
 * Copyright(C) 2017 ZHEXIN IT CO.,LTD. All rights reserved.
 */
package org.jsbd.boss.service.impl;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;

import org.apache.commons.lang.time.DateFormatUtils;
import org.jsbd.boss.dao.IRetentExecLogDAO;
import org.jsbd.boss.dao.IRetentLogDAO;
import org.jsbd.boss.domian.channel.ApkRetentLogVo;
import org.jsbd.boss.domian.channel.RetentExecLogVo;
import org.jsbd.boss.domian.channel.RetentLogConfig;
import org.jsbd.boss.service.IChannelApkInfoService;
import org.jsbd.boss.service.IRetentLogConfigService;
import org.jsbd.boss.service.IRetentLogService;
import org.jsbd.boss.util.SortList;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

/**
 * TODO 请加入本类的说明
 * 
 * @author <a href="mailto:xupengcheng@zhexinit.com" >徐鹏程</a>
 * @version 1.0.0
 */
@Service
public class RetentLogServiceImpl implements IRetentLogService {
	public static final Logger LOGGER = LoggerFactory.getLogger(RetentLogServiceImpl.class);

	@Resource
	private IRetentLogConfigService configService;

	@Resource
	private IRetentLogDAO retentLogDAO;

	@Resource
	private IRetentExecLogDAO retentExecLogDAO;

	@Resource
	private IChannelApkInfoService channelApkService;

	@Resource
	private IRetentLogConfigService retentLogConfigService;

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.jsbd.boss.service.IRetentLogService#countRetentExecTimes()
	 */
	@Override
	public void countRetentExecTimes() {
		List<RetentLogConfig> retentLogConfigList = retentLogConfigService.selectConfigList();
		Map<Integer, RetentLogConfig> apkMap = new HashMap<Integer, RetentLogConfig>();
		for (RetentLogConfig config : retentLogConfigList) {
			Integer apkId = config.getApkId();
			apkMap.put(apkId, config);
		}

		Map<String, Integer> apkTimesMap = new HashMap<String, Integer>();
		if (retentLogConfigList != null) {
			for (RetentLogConfig config : retentLogConfigList) {
				Integer taskNum = config.getTaskNum();
				if (taskNum == null) {
					taskNum = 0;
				}
				apkTimesMap.put(config.getApkId() + "*" + config.getExecTimes() + "*" + config.getRetentMonth(), taskNum);
			}
		}

		Integer currentMonth = Integer.parseInt(DateFormatUtils.format(System.currentTimeMillis(), "yyyyMM"));
		Integer[] apkIds = apkMap.keySet().toArray(new Integer[0]);
		for (Integer apkId : apkIds) {
			try {
				ApkRetentLogVo retentLogVo = new ApkRetentLogVo();
				retentLogVo.setApkId(apkId);
				retentLogVo.setCurrentMonth(currentMonth);
				retentLogVo.setExecDay(Integer.parseInt(DateFormatUtils.format(System.currentTimeMillis(), "yyyyMMdd")));
				List<ApkRetentLogVo> countList = retentLogDAO.selectCountList(retentLogVo);
				Map<Integer, List<RetentExecLogVo>> monthMap = new HashMap<Integer, List<RetentExecLogVo>>();
				RetentLogConfig logConfig = apkMap.get(apkId);
				for (ApkRetentLogVo logVo : countList) {
					Integer retentMonth = logVo.getRetentMonth();
					List<RetentExecLogVo> monthList = monthMap.get(retentMonth);
					if (monthList == null) {
						monthList = new ArrayList<RetentExecLogVo>();
					}
					RetentExecLogVo retentExecLogVo = new RetentExecLogVo();
					retentExecLogVo.setApkId(apkId);
					retentExecLogVo.setExecTotal(logVo.getTaskNum());
					retentExecLogVo.setMark(logConfig.getMark());
					retentExecLogVo.setExecTimes(logVo.getExecTimes());
					retentExecLogVo.setCurrCount(logVo.getTaskNum());
					retentExecLogVo.setRetentMonth(logVo.getRetentMonth());
					retentExecLogVo.setRetentExecMonth(currentMonth);
					retentExecLogVo.setExecCount(logVo.getExecCount());
					retentExecLogVo.setApkName(logConfig.getApkName());
					monthList.add(retentExecLogVo);
					monthMap.put(retentMonth, monthList);
				}
				initFillTimesData(monthMap, currentMonth, logConfig, apkTimesMap);
			} catch (Exception e) {
				LOGGER.error("补量次数统计出错", e);
			}
		}
	}

	/**
	 * 
	 * initFillTimesData:生成每个次数对应的数据
	 * 
	 * @author <a href="mailto:xupengcheng@zhexinit.com" >徐鹏程</a>
	 * @param monthMap
	 */
	private void initFillTimesData(Map<Integer, List<RetentExecLogVo>> monthMap, Integer currentMonth, RetentLogConfig config, Map<String, Integer> apkTimesMap) {
		if (monthMap != null && !monthMap.isEmpty()) {
			Integer[] months = monthMap.keySet().toArray(new Integer[0]);
			List<RetentExecLogVo> targetList = new ArrayList<RetentExecLogVo>();
			for (Integer month : months) {
				List<RetentExecLogVo> tempList = new ArrayList<RetentExecLogVo>();
				List<RetentExecLogVo> list = monthMap.get(month);
				SortList<RetentExecLogVo> execList = new SortList<>();
				execList.Sort(list, "getExecTimes", "desc");
				RetentExecLogVo maxLogVo = list.get(0);
				int maxExectimes = maxLogVo.getExecTimes();
				maxLogVo.setTaskNum(apkTimesMap.get(maxLogVo.getApkId() + "*" + maxLogVo.getExecTimes() + "*" + maxLogVo.getRetentMonth()));
				tempList.add(maxLogVo);
				targetList.add(maxLogVo);
				int index = 0;
				for (int i = maxExectimes - 1; i >= 0; i--) {
					RetentExecLogVo targetVo = new RetentExecLogVo();
					for (RetentExecLogVo sourceLogVo : list) {
						if (sourceLogVo.getExecTimes() == i) {
							// 存在一样的次数的
							targetVo = sourceLogVo;
						}
					}
					RetentExecLogVo preLogVo = tempList.get(index);
					if (i != 0) {
						targetVo.setExecTotal(preLogVo.getExecTotal() + targetVo.getExecTotal());
					}
					targetVo.setApkId(config.getApkId());
					targetVo.setMark(config.getMark());
					targetVo.setExecTimes(i);
					targetVo.setRetentMonth(month);
					targetVo.setRetentExecMonth(currentMonth);
					targetVo.setApkName(config.getApkName());
					targetVo.setTaskNum(apkTimesMap.get(targetVo.getApkId() + "*" + targetVo.getExecTimes() + "*" + targetVo.getRetentMonth()));
					tempList.add(targetVo);
					targetList.add(targetVo);
					index++;
				}
			}
			RetentExecLogVo delLogVo = new RetentExecLogVo();
			delLogVo.setMark(config.getMark());
			delLogVo.setRetentExecMonth(currentMonth);
			retentExecLogDAO.delete(delLogVo);
			retentExecLogDAO.batchInsert(targetList);
		}

	}

}
